{This file is part of CheLive.

CheLive is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Foobar is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Foobar.  If not, see <http://www.gnu.org/licenses/>.}

{Модуль реализует вывод 2D примитивов}
unit Core2D;

interface

uses
	gl, CoreTypes, CoreMath;

const
	{Флаг указывающий на то что примитив будет отрисован в виде каркаса}
	G2D_NONE = 0;
	{Флаг указывающий на то что примитив будет закрашен}
	G2D_FILL = 1;

type
	{Занимается выводом 2D примитивов}
	TG2D = class
		{Вывод отрезка
		@param(pos начальная точка)
		@param(pos2 конечная точка)
		@param(width толщина)
		@param(c цвет)}
		procedure Line(pos, pos2: TVec2; width: Single; c: TVec4);
		{Вывод прямоугольника
		@param(r положение и размер)
		@param(c цвет)
		@param(flags G2D_NONE или G2D_FILL)}
		procedure Rect(r: TRect; c: TVec4; flags: Integer = 0);
		{Вывод окружности)
		@param(pos положение)
		@param(r радиус)
		@param(q кол-во сегментов составляющих окружность)
		@param(c цвет)
		@param(flags G2D_NONE или G2D_FILL)}
		procedure Circle(pos: TVec2; r: Single; q: Integer; c: TVec4; flags: Integer = 0);
	end;

var
	g2d: TG2D;

implementation

procedure TG2D.Line(pos, pos2: TVec2; width: Single; c: TVec4);
begin
	glDisable(GL_TEXTURE_2D);
	glColor4f(c.x, c.y, c.z, c.w);
	glLineWidth(width);
	glBegin(GL_LINES);
		glVertex2f(pos.x, pos.y);
		glVertex2f(pos2.x, pos2.y);
	glEnd;
end;

procedure TG2D.Rect(r: TRect; c: TVec4; flags: Integer = 0);
begin
	glDisable(GL_TEXTURE_2D);
	glColor4f(c.x, c.y, c.z, c.w);

	if flags and G2D_FILL <> 0 then
	begin
		glBegin(GL_QUADS);
	end else
	begin
		glBegin(GL_LINE_STRIP);
	end;

	glVertex2f(r.x, r.y);
	glVertex2f(r.x, r.y + r.h);
	glVertex2f(r.x + r.w, r.y + r.h);
	glVertex2f(r.x + r.w, r.y);

	if flags and G2D_FILL <> 0 then
	begin
		glVertex2f(r.x, r.y);
	end;

	glEnd;
end;

procedure TG2D.Circle(pos: TVec2; r: Single; q: Integer; c: TVec4; flags: Integer = 0);
var
	i, start: Integer;
	k: Single;
begin
	//выч. кол-во сегментов (макс. 360)
	q := Min(q, 360);
	//угол охватывающий один сегмент
	k := 360 / q;
	start := 0;

	glDisable(GL_TEXTURE_2D);
	glColor4f(c.x, c.y, c.z, c.w);
	
	if flags and G2D_FILL <> 0 then
	begin
		start := 1;

		glBegin(GL_TRIANGLE_FAN);
		glVertex2f(pos.x, pos.y);
	end else
	begin
		glBegin(GL_LINE_STRIP);
	end;

	for i := q + 1 downto start do
	begin
		glVertex2f(pos.x + r * Cos(i * k * MATH_TO_RAD), pos.y + r * Sin(i * k * MATH_TO_RAD));
	end;

	glEnd;
end;

end.
